home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Purity
/
Purity #52 (1995-10-30)(PackMAN)(DE)[WB, FFS].zip
/
Purity #52 (1995-10-30)(PackMAN)(DE)[WB, FFS].adf
/
OS2Unit
/
OS2Unit.p
< prev
next >
Wrap
Text File
|
1995-09-17
|
11KB
|
427 lines
UNIT OS2;
{** OS2-Unit, (C) 1995 by Björn Schotte
**
** GIFTWARE
**
**
** Björn Schotte
** Am Burkardstuhl 45
** D-97267 Himmelstadt
** (Rückporto nicht vergessen!)
**
**
** EMail: bjoern@bomber.mayn.sub.de
**
**
** Pascal-FTP-Server: ftp@bomber.mayn.sub.de
** (Subject/Body: HELPALL)
**
**}
INTERFACE
USES Intuition, Exec;
{$incl "gadtools.lib",
"graphics/text.h",
"asl.lib",
"dos.lib"}
CONST
FREQ_NOTALLOC = -100;
TYPE
p_ASLFileStruct = ^ASLFileStruct;
ASLFileStruct = RECORD
left, top,
width,
height : INTEGER;
titel : STRING[80];
pfad,
datei,
initp,
initd,
filename : STRING[256];
pattern : STRING[80];
display_pat: BOOLEAN;
win : p_Window;
winsleep,
canceled : BOOLEAN;
negativ,
positiv : STRING;
END;
VAR
topaz80 : TextAttr;
MyTattr : ^TextAttr;
WBRight, WBBottom,
ScreenW, ScreenH, FontX,
FontY, XOff, YOff : LONG;
MyPrgName : STR;
FUNCTION OpenGadTools(version:INTEGER) : BOOLEAN;
FUNCTION OpenASL(version:INTEGER) : BOOLEAN;
PROCEDURE CloseGadTools;
PROCEDURE CloseASL;
FUNCTION ComputeX(value:INTEGER) : INTEGER;
FUNCTION ComputeY(value:INTEGER) : INTEGER;
PROCEDURE ComputeFont(VAR f : p_TextFont;
width,height : INTEGER);
PROCEDURE SensitivGadget(VAR ng:NewGadget);
PROCEDURE FS_BevelBox(VAR wo : p_Window;
VAR vi : PTR;
x,y,b,h : INTEGER;
recessed : BOOLEAN);
PROCEDURE GadSelect(VAR wp:p_Window; VAR gad:p_Gadget);
PROCEDURE SetCheckBox(VAR wp:p_Window; VAR gad:p_Gadget; req:p_Requester;
flag:BOOLEAN);
PROCEDURE SetMXGad(VAR wp:p_Window; VAR gad:p_Gadget; req:p_Requester;
active:LONG);
PROCEDURE SetCycleGad(VAR wp:p_Window; VAR gad:p_Gadget; req:p_Requester;
active:LONG);
PROCEDURE SetListViewGad(VAR wp:p_Window; VAR gad:p_Gadget; req:p_Requester;
active,top:LONG);
PROCEDURE SetListViewList(VAR wp:p_Window; VAR gad:p_Gadget; req:p_Requester;
VAR NeueList : p_List);
PROCEDURE SetNumberGad(VAR wp:p_Window; VAR gad:p_Gadget; req:p_Requester;
nummer:LONG);
PROCEDURE GhostGadget(VAR wp:p_Window; VAR gad:p_Gadget; req:p_Requester;
dis:BOOLEAN);
PROCEDURE ActStringGad(VAR wp:p_Window; VAR gad:p_Gadget; req:p_Requester);
PROCEDURE InitASLStruct(VAR asls : ASLFileStruct);
FUNCTION ASLFileReq(VAR ASLStruct : ASLFileStruct) : LONG;
FUNCTION UserReq(win:p_Window;tit,txt,gad:STR) : LONG;
IMPLEMENTATION
{ Versucht, die "gadtools.library" mit der angegebenen Versionsnummer
zu öffnen.
Eingabe: Mind.-Version
Ausgabe: TRUE bei Erfolg, ansonsten FALSE }
FUNCTION OpenGadTools;
BEGIN
OpenGadTools := FALSE;
GadToolsBase := OpenLibrary("gadtools.library", version);
IF GadToolsBase <> NIL THEN OpenGadTools := TRUE;
END;
FUNCTION OpenASL;
BEGIN
OpenASL := FALSE;
ASLBase := OpenLibrary("asl.library", version);
IF ASLBase <> NIL THEN OpenASL := TRUE;
END;
{ Schliesst die "gadtools.library" }
PROCEDURE CloseGadTools;
BEGIN
IF GadToolsBase <> NIL THEN CloseLibrary(GadToolsBase);
GadToolsBase := NIL;
END;
PROCEDURE CloseASL;
BEGIN
IF ASLBase <> NIL THEN CloseLibrary(ASLBase);
ASLBase := NIL;
END;
{ Eingabe: Breite bei topaz/8-Font }
{ Ausgabe: Breite bei aktuellem Font }
FUNCTION ComputeX;
BEGIN
ComputeX := ((FontX * value)+4) DIV 8;
END;
{ Eingabe: Höhe bei topaz/8-Font }
{ Ausgabe: Höhe bei aktuellem Font }
FUNCTION ComputeY;
BEGIN
ComputeY := ((FontY*value)+4) DIV 8;
END;
PROCEDURE ComputeFont;
LABEL UseTopaz;
BEGIN
Forbid;
MyTattr := ^topaz80;
MyTattr^.ta_Name := f^.tf_Message.mn_Node.ln_Name;
MyTattr^.ta_YSize := f^.tf_YSize;
FontY := f^.tf_YSize;
FontX := f^.tf_XSize;
Permit;
IF (width>0) AND (height>0) THEN
BEGIN
IF ( (ComputeX(width)+xoff+WBRight)>ScreenW) THEN GOTO UseTopaz;
IF ( (ComputeY(height)+yoff+WBBottom)>ScreenH) THEN GOTO UseTopaz;
END;
EXIT;
UseTopaz:
MyTattr^.ta_Name := "topaz.font";
FontX := 8;
FontY := 8;
MyTattr^.ta_Flags := FPF_ROMFONT;
MyTattr^.ta_YSize := 8;
END;
{ Modifiziert die Koordinaten eines Gadgets so, daß }
{ sie sich fontsensitiv anpassen. }
PROCEDURE SensitivGadget;
BEGIN
ng.ng_LeftEdge := ComputeX(ng.ng_LeftEdge)+xoff;
ng.ng_TopEdge := ComputeY(ng.ng_TopEdge)+yoff;
ng.ng_Width := ComputeX(ng.ng_Width);
ng.ng_Height := ComputeY(ng.ng_Height);
END;
{ Zeichnet eine (fontsensitive) BevelBox }
PROCEDURE FS_BevelBox;
VAR
t : ARRAY[1..3] OF TagItem;
BEGIN
t[1] := TagItem(GT_VisualInfo,LONG(vi));
t[2] := TagItem(GTBB_Recessed, LONG(recessed));
t[3].ti_Tag := TAG_DONE;
DrawBevelBoxA(wo^.RPort,
xoff+ComputeX(x),
yoff+ComputeY(y),
ComputeX(b),
ComputeY(h),
^t);
END;
{ Nützliches Feature: Bei gadtools-Gadgets kann man per
GT_Underscore einen Buchstaben im Gadget-Text unter-
streichen. Dies soll ja bekanntlich signalisieren,
daß man durch Drücken dieses unterstrichenen Buchsta-
bens das Gadget auswählen kann. Um dies "sichtbar" zu
machen, sollte das Gadget beim Drücken der Taste inver-
tiert werden, und beim Loslassen wieder im "normalen"
Zustand gebracht werden.
Eingabe: Das Fenster, wo es selektiert werden soll und
das Gadget (logisch !) }
PROCEDURE GadSelect;
VAR
next : p_Gadget;
old : LONG;
dummy : BOOLEAN;
class, code : LONG;
msg : p_IntuiMessage;
BEGIN
old := wp^.IDCMPFlags;
dummy:=ModifyIDCMP(wp,IDCMP_RAWKEY);
next := gad^.NextGadget;
gad^.NextGadget := NIL;
gad^.Flags := gad^.Flags + SELECTED;
RefreshGadgets(gad,wp,NIL);
REPEAT
msg := p_IntuiMessage(WaitPort(wp^.UserPort));
msg := GT_GetIMsg(wp^.UserPort);
class := msg^.Class;
code := msg^.Code;
GT_ReplyIMsg(msg);
UNTIL (class = IDCMP_RAWKEY) AND ( (code AND IECODE_UP_PREFIX)=IECODE_UP_PREFIX);
dummy:=ModifyIDCMP(wp,old);
gad^.Flags := gad^.Flags - SELECTED;
RefreshGadgets(gad,wp,NIL);
gad^.NextGadget := next;
END;
{ CheckBox-Gadget an- bzw. ausschalten.
Eingabe: Fenster, das Gadget und - wenn nötig - der
Requester, auf dem das Gadget "liegt" }
PROCEDURE SetCheckBox;
VAR
t : ARRAY[1..2] OF TagItem;
BEGIN
t[1] := TagItem(GTCB_Checked, ORD(flag));
t[2].ti_Tag := TAG_DONE;
GT_SetGadgetAttrsA(gad, wp, req, ^t);
END;
PROCEDURE SetMXGad;
VAR
t : ARRAY[1..2] OF TagItem;
BEGIN
t[1] := TagItem(GTMX_Active, active);
t[2].ti_Tag := TAG_DONE;
GT_SetGadgetAttrsA(gad,wp,req,^t);
END;
PROCEDURE SetCycleGad;
VAR
t : ARRAY[1..2] OF TagItem;
BEGIN
t[1] := TagItem(GTCY_Active, active);
t[2].ti_Tag := TAG_DONE;
GT_SetGadgetAttrsA(gad,wp,req,^t);
END;
PROCEDURE SetListViewGad;
VAR
t : ARRAY[1..3] OF TagItem;
BEGIN
t[1] := TagItem(GTLV_Selected, active);
t[2] := TagItem(GTLV_Top, top);
t[3].ti_Tag := TAG_DONE;
GT_SetGadgetAttrsA(gad,wp,req,^t);
END;
PROCEDURE SetListViewList;
VAR
t : ARRAY[1..2] OF TagItem;
BEGIN
t[1] := TagItem(GTLV_Labels, LONG(NeueList));
t[2].ti_Tag := TAG_DONE;
GT_SetGadgetAttrsA(gad,wp,req,^t);
END;
PROCEDURE SetNumberGad;
VAR
t : ARRAY[1..2] OF TagItem;
BEGIN
t[1] := TagItem(GTNM_Number, nummer);
t[2].ti_Tag := TAG_DONE;
GT_SetGadgetAttrsA(gad,wp,req,^t);
END;
PROCEDURE GhostGadget;
VAR
t : ARRAY[1..2] OF TagItem;
BEGIN
t[1] := TagItem(GA_Disabled, ORD(dis));
t[2].ti_Tag := TAG_DONE;
GT_SetGadgetAttrsA(gad,wp,req,^t);
END;
PROCEDURE ActStringGad;
VAR
dummy : BOOLEAN;
BEGIN
dummy := ActivateGadget(gad,wp,req);
END;
PROCEDURE InitASLStruct;
BEGIN
asls := ASLFileStruct(-1,-1,-1,-1,"","","","","","","",TRUE,NIL,FALSE,FALSE,
"","");
END;
FUNCTION ASLFileReq;
VAR
t : ARRAY[0..12] OF TagItem;
fre : p_FileRequester;
bool : BOOLEAN;
BEGIN
ASLFileReq := 0;
t[0].ti_Tag := ASLFR_InitialDrawer;
IF ASLStruct.initp <> "" THEN t[0].ti_Data := LONG(^ASLStruct.initp)
ELSE t[0].ti_Tag := TAG_IGNORE;
t[1].ti_Tag := ASLFR_InitialFile;
IF ASLStruct.initd <> "" THEN t[1].ti_Data := LONG(^ASLStruct.initd)
ELSE t[1].ti_Tag := TAG_IGNORE;
t[2] := TagItem(ASLFR_Window, LONG(ASLStruct.win));
IF ASLStruct.win <> NIL THEN t[2] := TagItem(ASLFR_SleepWindow, ORD(ASLStruct.winsleep))
ELSE t[2].ti_Tag := TAG_IGNORE;
t[3] := TagItem(ASLFR_TitleText, LONG(^ASLStruct.titel));
IF ASLStruct.pattern <> "" THEN
BEGIN
t[4] := TagItem(ASLFR_InitialPattern, LONG(^ASLStruct.pattern))
END ELSE
BEGIN
t[4].ti_Tag := TAG_IGNORE;
END;
IF ASLStruct.display_pat THEN
t[5] := TagItem(ASLFR_DoPatterns, ORD(TRUE))
ELSE
t[5].ti_Tag := TAG_IGNORE;
IF ASLStruct.left > -1 THEN t[6] := TagItem(ASLFR_InitialLeftEdge, ASLStruct.left)
ELSE t[6].ti_Tag := TAG_IGNORE;
IF ASLStruct.top > -1 THEN t[7] := TagItem(ASLFR_InitialTopEdge, ASLStruct.top)
ELSE t[7].ti_Tag := TAG_IGNORE;
IF ASLStruct.width > -1 THEN t[8] := TagItem(ASLFR_InitialWidth, ASLStruct.width)
ELSE t[8].ti_Tag := TAG_IGNORE;
IF ASLStruct.height > -1 THEN t[9] := TagItem(ASLFR_InitialHeight, ASLStruct.height)
ELSE t[9].ti_Tag := TAG_IGNORE;
IF ASLStruct.negativ <> "" THEN
t[10] := TagItem(ASLFR_NegativeText, LONG(^ASLStruct.negativ))
ELSE
t[10].ti_Tag := TAG_IGNORE;
IF ASLStruct.positiv <> "" THEN
t[11] := TagItem(ASLFR_PositiveText, LONG(^ASLStruct.positiv))
ELSE
t[11].ti_Tag := TAG_IGNORE;
t[12].ti_Tag := TAG_DONE;
fre := AllocASLRequest(ASL_FileRequest, ^t);
IF fre <> NIL THEN
BEGIN
IF ASLRequest(fre, ^t) THEN
BEGIN
ASLStruct.pfad := fre^.rf_Dir;
ASLStruct.datei := fre^.rf_File;
ASLStruct.canceled := FALSE;
ASLStruct.filename := ASLStruct.pfad;
bool := AddPart(ASLStruct.filename,ASLStruct.datei,256);
ASLStruct.pattern := fre^.rf_Pat;
ASLStruct.initp := ASLStruct.pfad;
ASLStruct.initd := ASLStruct.datei;
END ELSE
BEGIN
IF IOErr = 0 THEN ASLStruct.canceled := TRUE
ELSE
BEGIN
ASLStruct.canceled := FALSE;
ASLFileReq := IOErr;
END;
END;
FreeASLRequest(fre);
END ELSE ASLFileReq := FREQ_NOTALLOC;
END;
PROCEDURE GetPrgName;
TYPE
BCPLStrPtr = ^BCPLStr;
BCPLStr = ARRAY[0..MaxByte] OF CHAR;
VAR
MyTask : p_Task;
MyProc : p_Process;
ThisCli : p_CommandLineInterface;
ThisName : BCPLStrPtr;
tn : BCPLStr;
name : STRING[256];
s : STR;
BEGIN
MyTask := FindTask(NIL);
MyProc := p_Process(MyTask);
ThisCli := PTR(4*MyProc^.pr_Cli);
ThisName := BCPLStrPtr(4*ThisCli^.cli_CommandName);
tn := ThisName^;
s := STR(^TN[1]);
name := s;
name[ord(TN[0])+1]:=CHR(0);
MyPrgName := name;
END;
FUNCTION UserReq;
VAR
es : EasyStruct;
BEGIN
es := EasyStruct(SizeOf(EasyStruct),0,tit,txt,gad);
UserReq := EasyRequestArgs(win,^es,NIL,NIL);
END;
BEGIN
topaz80 := TextAttr("topaz.font", 8, 0, 0);
GetPrgName;
END.